/* 剩余参数 */
{
  // 剩余参数 (rest parameters)必须放在所有参数的后面，并使用...语法
  function multiply(n: number, ...m: number[]) {
    return m.map((x) => n * x);
  }
  // 'a' gets value [10, 20, 30, 40]
  const a = multiply(10, 1, 2, 3, 4);
}

{
  // 可以借助一个使用 ... 语法的数组，为函数提供不定数量的实参
  const arr1 = [1, 2, 3];
  const arr2 = [4, 5, 6];
  arr1.push(...arr2);

  // 类型被推断为 number[] -- "an array with zero or more numbers",
  // not specifically two numbers
  const args = [8, 5];
  const angle = Math.atan2(...args); // TypeScript 并不会假定数组是不变的
  // A spread argument must either have a tuple type or be passed to a rest parameter.
  // 解决办法
  const args1 = [8, 5] as const; // 通过 as const 语法将其变为只读元组
  const angle1 = Math.atan2(...args1);
}
